package com.lyz.dataStructure.dome;/**
 * @Author:759057893@qq.com Lyz
 * @Date: ${Date} 17:17
 * @Description:
 **/

import java.util.ArrayList;

/**
 *@Author:759057893@qq.com Lyz
 *@Date: 2019/7/13 17:17
 *@Description:
 **/
public class StackDemo<E> {
    private volatile ArrayList<E> list = new ArrayList<>();

    /**
     * 将item压入栈顶，功能和addElement等效
     */
    public E push(E item) {
        list.add(item);
        return item;
    }

    /**
     * 移除堆栈顶部的对象，并将该对象作为该函数的值返回。
     * 或者解释为：返回Vector集合的最后一个元素
     *
     *
     */
    public synchronized E pop() {
        E obj;
        int len = list.size();
        obj = peek();
        list.remove(len - 1);
        return obj;
    }

    /**
     * 获取堆栈顶部的对象，而不将其从堆栈中移除。
     * 或者解释为：返回Vector集合的最后一个元素
     *
     *
     */
    public synchronized E peek() {
        if (list.size() == 0) {
            return null;
        }
        return list.get(list.size() - 1);
    }

    /**
     * stack是否为null.
     */
    public boolean empty() {
        return list.size() == 0;
    }

    /**
     * 从栈顶开始寻找，查找当前项o到栈顶的距离。
     * 栈顶元素距离栈顶的距离为1，其他的以此类推。
     * 如果当前项o不在栈中，则返回-1.
     */
    public synchronized int search(Object o) {
        int size = list.size();
        int position = 1;
        for (int i = size - 1; i >= 0; i--) {
            if (o == list.get(i)) {
                return position;
            }
            position++;
        }
        return -1;
    }

    public static void main(String[] args) {
        StackDemo s = new StackDemo();
        s.push(1);s.push(2);
        s.push(3);
        s.push(4);

        System.out.println(s.pop());
        System.out.println(s.peek());
        System.out.println(s.peek());
        System.out.println(s.empty());
        System.out.println(s.search(1));

    }
}
